package KuangShen.ZhuJieHeFanShe;
//Java的内存分为 堆、栈、方法区（特殊堆）
//堆：存放new()出来的对象，可以被所有的线程共享，不会被存放的对象引用。
//栈：存放基本变量类型（包含基本类型的具体数值），引用对象的变量（会存放该引用在堆里的具体地址）。
//方法区：可以被所有的线程共享，包含了所有的class和static变量
public class test05 {
    public static void main(String[] args) {
//        当程序主动使用某个类，如果该类还未被加载到java内存中，则系统会对类进行初始化。
//        初始化步骤：
//        类的加载：将类的class文件读入内存，并为之创建一个java.lang.Class对象。此过程由类加载器完成
//        类的链接：将类的二进制数据合并到JRE中
//        类的初始化：JVM负责对类进行初始化
        A a =new A();
        System.out.println(A.m);
    }
}
class A{
    //    静态代码块
    static {
    System.out.println("A类静态代码块初始化");
    m =300;
    }
    static int m =100;//静态变量
//  静态代码块和静态变量在初始化的时候会被合并,相同变量被覆盖，如m的值。
//  static {
//  System.out.println("A类静态代码块初始化");
//  m =300;
//  static int m =100;
//  }
//
    public A() {
        System.out.println("A类的无参构造初始化");
    }
}
//代码写好后，会被编译成.Class文件加载到Java内存中
//所有的各种类加载到方法区，首先类A和类test05的数据（静态变量、静态方法、常量池、代码...）加载到方法区。
//在堆中产生各个类的Class对象，生成分别代表test05、A类的“java.lang.Class”对象。每个“java.lang.Class”对象包含了其代表类的所有东西。这是反射原理的关键。
//在栈中执行main();方法。
//每个类产生的对象会都指向该类唯一的的class文件，并通过class文件访问该类的所有数据（静态变量、静态方法、常量池、代码...）
